﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;
using SharpArch.Domain.DomainModel;

namespace ADIGRE.Domain
{
    public class Usuario : Entity
    {
        [Display(Name = "Login"), Required(ErrorMessage = "Informe o login", AllowEmptyStrings = true)]
        public virtual string NmLogin { get; set; }
        [Display(Name = "Senha")]
        public virtual string NmSenha { get; set; }
        public virtual bool IsRoot { get; set; }
        public virtual Pessoa Pessoa { get; set; }

        [Display(Name="Perfil")]
        public virtual EnumPerfilAcesso EnumPerfilAcesso { get; set; }
        public virtual IList<LogAcesso> LogAcessos { get; set; }

        //Log de estado
        [Display(Name = "Excluido"), Required]
        public virtual bool IsExcluido { get; set; }
        [Display(Name = "Excluido em"), DisplayFormat(DataFormatString = "{0:dd/MM/yyyy HH:mm}")]
        public virtual DateTime? DtDesabilitado { get; set; }
        [Display(Name = "Excluido por")]
        public virtual Usuario UsuarioDesabilitado { get; set; }
        [Display(Name = "Cadastrado em"), DisplayFormat(DataFormatString = "{0:dd/MM/yyyy HH:mm}")]
        public virtual DateTime? DtCadastro { get; set; }
        [Display(Name = "Cadastrado por")]
        public virtual Usuario UsuarioCadastro { get; set; }
        [Display(Name = "Última alteração em"), DisplayFormat(DataFormatString = "{0:dd/MM/yyyy HH:mm}")]
        public virtual DateTime? DtAlterado { get; set; }
        [Display(Name = "Alterado por")]
        public virtual Usuario UsuarioAlterado { get; set; }
        //Log de estado

        public Usuario()
        {
            this.IsRoot = false;
            this.IsExcluido = false;
        }

        /// <summary>
        /// p.eduardo.silva - 20130529:
        /// Valída dados para que serem cadastrados
        /// </summary>
        /// <param name="user">Usuário da ação</param>
        private void ValidarCadastro(Usuario User)
        {
            this.UsuarioCadastro = User;
            this.DtCadastro = DateTime.Now;
            this.IsExcluido = false;
        }

        /// <summary>
        /// p.eduardo.silva - 20130529:
        /// Valída dados para que serem alterados
        /// </summary>
        /// <param name="user">Usuário da ação</param>
        private void ValidarAlteracao(Usuario User)
        {
            this.UsuarioAlterado = User;
            this.DtAlterado = DateTime.Now;
        }

        /// <summary>
        /// p.eduardo.silva - 20130529:
        /// Valída dados para que serem desabilitados
        /// </summary>
        /// <param name="user">Usuário da ação</param>
        public virtual void ValidarExclusao(Usuario User)
        {
            this.UsuarioDesabilitado = User;
            this.DtDesabilitado = DateTime.Now;
            this.IsExcluido = true;
        }

        /// <summary>
        /// p.eduardo.silva - 20130601:
        /// Valída dados para que serem atualizados
        /// </summary>
        /// <param name="user">Usuário da ação</param>
        public virtual void Validar(Usuario user)
        {
            if (this.Id > 0)
                ValidarAlteracao(user);
            else
                ValidarCadastro(user);

        }

        /// <summary>
        /// p.eduardo.silva - 20130529:
        /// Preenche os campos vazios do objeto atual de acordo com o objeto passado
        /// </summary>
        /// <param name="pessoa">Informações que iram completar</param>
        /// <returns></returns>
        public virtual void Complete(Usuario usuario)
        {
            //dados comuns
            if (usuario.DtAlterado.HasValue)
            {
                this.DtAlterado = usuario.DtAlterado;
                if (usuario.UsuarioDesabilitado != null)
                    this.UsuarioDesabilitado = usuario.UsuarioDesabilitado;
                if (usuario.DtCadastro.HasValue)
                    this.DtCadastro = usuario.DtCadastro;
                if (usuario.DtDesabilitado.HasValue)
                    this.DtDesabilitado = usuario.DtDesabilitado;
                if (usuario.UsuarioAlterado != null)
                    this.UsuarioAlterado = usuario.UsuarioAlterado;
                if (usuario.UsuarioCadastro != null)
                    this.UsuarioCadastro = usuario.UsuarioCadastro;

                //dados diferenciados
                if (!string.IsNullOrWhiteSpace(usuario.NmLogin))
                    this.NmLogin = usuario.NmLogin;
                if (!string.IsNullOrWhiteSpace(usuario.NmSenha))
                    this.NmSenha = usuario.NmSenha;
                if (!usuario.EnumPerfilAcesso.Equals(EnumPerfilAcesso.Outro))
                    this.EnumPerfilAcesso = usuario.EnumPerfilAcesso;
            }
        }

    }
}